package cn.biplam.front.template.base;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.HtmlImage;
import cn.biplam.front.html.HtmlText;
import cn.biplam.front.html.HtmlValue;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Clear_Type;
import cn.biplam.front.html.base.Const.Cursor_Type;
import cn.biplam.front.html.base.Const.Float_Type;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.template.Template;

/**
 * 复选框组件。<BR>
 * 可以用ID、文本说明、复选框的排列样式(横排和竖排)来初始化复选框。<BR>
 * 提交变量名是 CheckBox.name+"value"<BR>
 * 复选框的选中值是一个CheckBox.ID，如果没有选中，提交变量为空<BR>
 */
public class CheckBox implements Template{

	public enum Layout_Type {
		/**横排*/
		Horizontal,
		/**竖排 */
		Vertical;  
	}

	private boolean inGroup=false;

	private String name;
	private String fullID;
	private String text;
	private String sHomeUrl;
	private Layout_Type type;
	private HtmlDiv mCheckBox;
	private boolean checked;
	private boolean readOnly;
	private String checkAllID;
	private final String imgCheck = "/images/check.gif";
	private final String imgUnCheck = "/images/uncheck.gif";
	private final String imgReadOnlyCheck = "/images/check2.gif";
	private final String imgReadOnlyUnCheck = "/images/uncheck2.gif";

	/** 选中时图片容器ID */
	private String imageID;
	private String ID;
	/** 不选中时图片容器ID */

	/**
	 * 构造方法  传入对象的页面ID和文本初始化
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @throws ErrorMessage 
	 */
	public CheckBox(String name,String ID,String sHomeUrl) throws ErrorMessage{
		this(name,ID,sHomeUrl,"");
	}

	/**
	 * 构造方法
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @param text 复选框所代表对象的说明
	 * @throws ErrorMessage
	 */
	public CheckBox(String name,String ID,String sHomeUrl,String text) throws ErrorMessage{
		this(name,ID,sHomeUrl,text,Layout_Type.Horizontal);
	}

	/**
	 * 构造方法
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @param text 复选框所代表对象的说明
	 * @param checked 是否选中
	 * @throws ErrorMessage
	 */
	public CheckBox(String name,String ID,String sHomeUrl,String text,boolean checked) throws ErrorMessage{
		this(name,ID,sHomeUrl,text,Layout_Type.Horizontal,checked,false,null);
	}

	/**
	 * 构造方法
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @param text 复选框所代表对象的说明
	 * @param checked 是否选中
	 * @param readOnly 是否只读
	 * @throws ErrorMessage
	 */
	public CheckBox(String name,String ID,String sHomeUrl,String text,boolean checked,boolean readOnly) throws ErrorMessage{
		this(name,ID,sHomeUrl,text,Layout_Type.Horizontal,checked,readOnly,null);
	}

	/**
	 * 构造方法		传入对象的页面ID和文本初始化
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @param text 复选框所代表对象的说明
	 * @param type 排版类型
	 * @throws ErrorMessage 
	 */
	public CheckBox(String name,String ID,String sHomeUrl,String text,Layout_Type type) throws ErrorMessage{
		this(name,ID,sHomeUrl,text,type,false,false,null);
	}

	/**
	 * 构造方法 传入对象的页面ID和文本初始化
	 * @param 复选框的名字
	 * @param ID 复选框所代表对象ID
	 * @param sHomeUrl	应用系统路径
	 * @param text 复选框所代表对象的说明
	 * @param type 排版类型
	 * @param checked  是否被选中
	 * @param readOnly 是否只读
	 * @param checkAllID  负责全选操作的checkbox的页面id
	 * @throws ErrorMessage 
	 */
	public CheckBox(String name,String ID,String sHomeUrl,String text,Layout_Type type,
			boolean checked,boolean readOnly,String checkAllID) throws ErrorMessage{
		this.name = name;
		this.ID=ID;
		this.fullID = name+","+ID;
		this.type = type;
		this.sHomeUrl=sHomeUrl;
		this.text = text;
		this.checked = checked;
		this.readOnly = readOnly;
		this.checkAllID = checkAllID;
		this.imageID=this.fullID+"i";//选中
	}

	private void _init() throws ErrorMessage{
		this.mCheckBox = new HtmlDiv();
		this.mCheckBox.setCursor(Cursor_Type.Hand);
		switch(this.type){
		case Horizontal:
			mCheckBox.setFloat(Float_Type.Left);
			break;
		case Vertical:
			mCheckBox.setClear(Clear_Type.Left);
		}
		this._createImage();
		this._createText();
		this._createValue();
	}

	/**
	 * checkbox图片
	 * @throws ErrorMessage
	 */
	private void _createImage() throws ErrorMessage{
		/**创建DIV*/
		HtmlDiv frame=new HtmlDiv(this.fullID+"c","chbi");//图片容器
		String urlCheck=this._getImageUrl(true);		//未选中图片url
		String urlUnCheck=this._getImageUrl(false);		//选中图片url
		HtmlImage mImage;

		if(this.checked){
			mImage=new HtmlImage(urlCheck);
			frame.put(new HtmlValue(this.fullID+"s","2"));	//当前选择状态1=未选中2=选中
		}else{
			mImage=new HtmlImage(urlUnCheck);
			frame.put(new HtmlValue(this.fullID+"s","1"));	//当前选择状态1=未选中2=选中
		}
		mImage.setID(this.imageID);
		frame.put(mImage);

		/**放入url参数容器*/
		this.mCheckBox.put(new HtmlValue(this.fullID+1,urlUnCheck));//未选中图片url
		this.mCheckBox.put(new HtmlValue(this.fullID+2,urlCheck));//选中图片url


		if(!this.readOnly){
			/**绑定事件*/
			frame.bind(Window_Event.OnClick, this._getBindScriptText());
			this._bindCheckAllScript();
		}

		/**放入容器*/
		this.mCheckBox.put(frame);
	}

	/**
	 * checkbox文本说明
	 * @throws ErrorMessage 
	 */
	private void _createText() throws ErrorMessage{
		HtmlWindow text = new HtmlText(null,"chbt",this.text);
		if(!this.readOnly){
			text.bind(Window_Event.OnClick, this._getBindScriptText());
		}
		if(!TOOLS.StringIsEmpty(this.text)){
			this.mCheckBox.put(text);
		}
	}

	/**
	 * 判断只读标志，返回选中或未选中的图片完整URL
	 * @param check 是否是已选择图片,true 是 ,false不是
	 * @return HtmlDiv
	 */
	private String _getImageUrl(boolean check) throws ErrorMessage{
		String imageUrl = null;
		if(check){
			if(this.readOnly){
				imageUrl = this.imgReadOnlyCheck;
			}else{
				imageUrl = this.imgCheck;
			}
		}else{
			if(this.readOnly){
				imageUrl = this.imgReadOnlyUnCheck;
			}else{
				imageUrl = this.imgUnCheck;
			}
		}
		return this.sHomeUrl+imageUrl;
	}

	/**
	 * 绑定脚本
	 * @param thisDivID  要绑定脚本的图片divId(选中或不选中的图片)
	 * @return
	 */
	private String _getBindScriptText(){
		StringBuilder sb = new StringBuilder();
		sb.append("cbkt('");
		sb.append(this.fullID);
		sb.append("','");
		sb.append(this.name);
		sb.append("');");
		return sb.toString();
	}

	/**
	 * 创建提交值(仅在独立CheckBox时创建,组合式在CheckBoxGroup中创建)
	 */
	private void _createValue() throws ErrorMessage{
		if(!this.inGroup){
			String var="";
			if(this.checked){
				var=this.ID;
			}
			HtmlValue value=new HtmlValue(this.name+"value",","+this.name+"value",var);
			this.mCheckBox.put(value);
		}
	}

	/**
	 * 向全选checkBox注册当前checkBox点击事件
	 * @throws ErrorMessage 
	 */
	private void _bindCheckAllScript() throws ErrorMessage{
		if(this.checkAllID!=null){
			this.mCheckBox.bind(this.checkAllID,Window_Event.OnClick, "checkAll('"+this.checkAllID+"','"+this.fullID+"');");
		}
	}

	/**
	 * 返回复选框
	 * @return  HtmlDiv
	 * @throws ErrorMessage 
	 */
	public HtmlDiv get() throws ErrorMessage{
		this._init();
		mCheckBox.setLength(18+TOOLS.getTextLength(this.text));
		mCheckBox.setStyleSize(String.valueOf(mCheckBox.getLength()), "18");
		return mCheckBox;
	}

	public void setInGroup(boolean inGroup) {
		this.inGroup = inGroup;
	}
}
